home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 1.iso / toolbox / src / demos / OpenGL / space / objects.c < prev    next >
C/C++ Source or Header  |  1996-11-11  |  11KB  |  400 lines

  1. /*
  2.  * Copyright (C) 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #include <math.h>
  18. #include <GL/gl.h>
  19. #include "space.h"
  20.  
  21. extern t_stopwatch Counter ;
  22.  
  23. /**********************************************************************
  24. *  object_space_station()  -
  25. **********************************************************************/
  26. sint32 object_space_station(sint32 resol)
  27.  
  28. {  register sint32 obj ;
  29.    register flot32 siz = 1.0 ;
  30.  
  31.    obj = glGenLists(1);
  32.    glNewList(obj,GL_COMPILE) ;
  33.  
  34.    glTranslatef(0.0,-60.0*siz,0.0) ;
  35.    make_toroid(100.0*siz,10.0*siz,resol) ;
  36.  
  37.    glRotatef( 90.0,1.0,0.0,0.0) ;
  38.    make_cylind(200.0*siz,5.0*siz,0,resol) ;
  39.    glRotatef(-90.0,1.0,0.0,0.0) ;
  40.    glRotatef( 90.0,0.0,0.0,1.0) ;
  41.    make_cylind(200.0*siz,5.0*siz,0,resol) ;
  42.    glRotatef(-90.0,0.0,0.0,1.0) ;
  43.  
  44.    glTranslatef(0.0, 60.0*siz,0.0) ;
  45.    make_cylind(250.0*siz,10.0*siz,1,resol) ;
  46.  
  47.    glTranslatef(0.0, 60.0*siz,0.0) ;
  48.    make_toroid(100.0*siz,10.0*siz,resol) ;
  49.  
  50.    glRotatef( 90.0,1.0,0.0,0.0) ;
  51.    make_cylind(200.0*siz,5.0*siz,0,resol) ;
  52.    glRotatef(-90.0,1.0,0.0,0.0) ;
  53.    glRotatef( 90.0,0.0,0.0,1.0) ;
  54.    make_cylind(200.0*siz,5.0*siz,0,resol) ;
  55.    glRotatef(-90.0,0.0,0.0,1.0) ;
  56.  
  57.    glEndList() ;
  58.  
  59.    return(obj) ;
  60. }
  61.  
  62. /**********************************************************************
  63. *  make_toroid()  -
  64. **********************************************************************/
  65. static void make_toroid(flot32 R,flot32 r,sint32 resol)
  66.  
  67. {  register sint32 i,j,i2 ;
  68.    register flot32 theta,phi,x,y,z,xc,yc,zc,cp,sp ;
  69.    register P8     arr[16][32] ;
  70.  
  71.    for (theta=0.0,i=0; i<resol; theta+=2.0*M_PI/resol,i++)  {
  72.      x = R + r*fcos(theta);
  73.      y = r*fsin(theta);
  74.      z = 0.0 ;
  75.  
  76.      xc = R ;
  77.      yc = 0.0 ;
  78.      zc = 0.0 ;
  79.  
  80.      for (phi=0.0,j=0; j<2*resol; phi+=M_PI/resol,j++)  {
  81.        cp = fcos(phi) ;
  82.        sp = fsin(phi) ;
  83.  
  84.        switch (((i&1)<<1) + (j&1))  {
  85.          case 0: arr[i][j].t.s = 0.0 ; arr[i][j].t.t = 0.0 ; break ;
  86.          case 1: arr[i][j].t.s = 1.0 ; arr[i][j].t.t = 0.0 ; break ;
  87.          case 2: arr[i][j].t.s = 0.0 ; arr[i][j].t.t = 1.0 ; break ;
  88.          case 3: arr[i][j].t.s = 1.0 ; arr[i][j].t.t = 1.0 ; break ;
  89.          }
  90.  
  91.        arr[i][j].n.x = ( (x-xc)*cp + (z-zc)*sp)/r ;
  92.        arr[i][j].n.y = ( (y-yc)               )/r ;
  93.        arr[i][j].n.z = (-(x-xc)*sp + (z-zc)*cp)/r ; 
  94.  
  95.        arr[i][j].p.x =  x*cp + z*sp ;
  96.        arr[i][j].p.y =  y ;
  97.        arr[i][j].p.z = -x*sp + z*cp ; 
  98.        }
  99.      }
  100.  
  101.    for (i=0; i<resol; i++)  {
  102.      i2 = ((i == resol-1) ? 0 : i+1) ;
  103.      glBegin(GL_TRIANGLE_STRIP) ;
  104.      for (j=0; j<2*resol; j++)  {
  105.        glTexCoord2fv(&arr[i2][j].t.s) ;
  106.        glNormal3fv(&arr[i2][j].n.x) ;
  107.        glVertex3fv(&arr[i2][j].p.x) ;
  108.  
  109.        glTexCoord2fv(&arr[i ][j].t.s) ;
  110.        glNormal3fv(&arr[i ][j].n.x) ;
  111.        glVertex3fv(&arr[i ][j].p.x) ;
  112.        }
  113.      glTexCoord2fv(&arr[i2][0].t.s) ;
  114.      glNormal3fv(&arr[i2][0].n.x) ;
  115.      glVertex3fv(&arr[i2][0].p.x) ;
  116.  
  117.      glTexCoord2fv(&arr[i ][0].t.s) ;
  118.      glNormal3fv(&arr[i ][0].n.x) ;
  119.      glVertex3fv(&arr[i ][0].p.x) ;
  120.      glEnd() ;
  121.      }
  122. }
  123.  
  124. /**********************************************************************
  125. *  make_cylind()  -
  126. **********************************************************************/
  127. static void make_cylind(flot32 L,flot32 r,sint32 flag,sint32 resol)
  128.  
  129. {  register sint32 j ;
  130.    register flot32 phi,cp,sp ;
  131.    register P8     arr[2][16] ;
  132.  
  133.    for (phi=0.0,j=0; j<resol; phi+=2.0*M_PI/resol,j++)  {
  134.      cp = fcos(phi) ;
  135.      sp = fsin(phi) ;
  136.  
  137.      if (flag)  {
  138.        if (j&1)  {
  139.          arr[0][j].t.s =  0.0 ;
  140.          arr[0][j].t.t =  0.0 ;
  141.          arr[1][j].t.s =  0.0 ;
  142.          arr[1][j].t.t = 32.0 ;
  143.          }
  144.        else  {
  145.          arr[0][j].t.s =  0.5 ;
  146.          arr[0][j].t.t =  0.0 ;
  147.          arr[1][j].t.s =  0.5 ;
  148.          arr[1][j].t.t = 32.0 ;
  149.          }
  150.        }
  151.      else  {
  152.        arr[0][j].t.s = 0.0 ;
  153.        arr[0][j].t.t = 0.0 ;
  154.        arr[1][j].t.s = 0.0 ;
  155.        arr[1][j].t.t = 0.0 ;
  156.        }
  157.  
  158.      arr[0][j].n.x = arr[1][j].n.x =  cp ;
  159.      arr[0][j].n.y = arr[1][j].n.y = 0.0 ;
  160.      arr[0][j].n.z = arr[1][j].n.z = -sp ; 
  161.  
  162.      arr[0][j].p.x = arr[1][j].p.x =  r*cp ;
  163.      arr[0][j].p.y =  -L/2.0 ;
  164.      arr[1][j].p.y =   L/2.0 ;
  165.      arr[0][j].p.z = arr[1][j].p.z = -r*sp ; 
  166.      }
  167.  
  168.    glBegin(GL_TRIANGLE_STRIP) ;
  169.    for (j=0; j<resol; j++)  {
  170.      glTexCoord2fv(&arr[1][j].t.s) ;
  171.      glNormal3fv(&arr[1][j].n.x) ;
  172.      glVertex3fv(&arr[1][j].p.x) ;
  173.  
  174.      glTexCoord2fv(&arr[0][j].t.s) ;
  175.      glNormal3fv(&arr[0][j].n.x) ;
  176.      glVertex3fv(&arr[0][j].p.x) ;
  177.      }
  178.    glTexCoord2fv(&arr[1][0].t.s) ;
  179.    glNormal3fv(&arr[1][0].n.x) ;
  180.    glVertex3fv(&arr[1][0].p.x) ;
  181.  
  182.    glTexCoord2fv(&arr[0][0].t.s) ;
  183.    glNormal3fv(&arr[0][0].n.x) ;
  184.    glVertex3fv(&arr[0][0].p.x) ;
  185.    glEnd() ;
  186. }
  187.  
  188. /**********************************************************************
  189. *  object_planet_orbit()  - 
  190. **********************************************************************/
  191. void object_planet_orbit(register t_body *body,flot32 tilt)
  192.  
  193. {  register sint32 i ;
  194.    register D3     f,center ;
  195.    register flot64 t,save,delta ;
  196.    register P3     *a,arr[256] ;
  197.  
  198.    center.x = 0.0;
  199.    center.y = 0.0;
  200.    center.z = 0.0;
  201.  
  202.    save = Counter.D ;
  203.    delta = body->ptr->yer / 256.0 ;
  204.  
  205.    if (body->ptr->ecc < 0.8) 
  206.      for (a=arr,i=0; i<256; a++,Counter.D+=delta,i++)  {
  207.        calc_posit(&f,body->ptr,¢er,tilt) ;
  208.        a->x = f.x ;
  209.        a->y = f.y ;
  210.        a->z = f.z ;
  211.        }
  212.    else  {
  213.      for (a=arr,i=0; i<256; a++,i++)  {
  214.        t = i/256.0 ;
  215.        if (t<=0.5)
  216.          t = 2.0*t*t ;
  217.        else t = (4.0 - 2.0*t)*t - 1.0 ;
  218.        Counter.D = body->ptr->ee + t*body->ptr->yer ;
  219.  
  220.        calc_posit(&f,body->ptr,¢er,tilt) ;
  221.        a->x = f.x ;
  222.        a->y = f.y ;
  223.        a->z = f.z ;
  224.        }
  225.      }
  226.  
  227.    Counter.D = save ;
  228.  
  229.    body->orbtobj[0] = glGenLists(1);
  230.    glNewList(body->orbtobj[0],GL_COMPILE) ;
  231.  
  232.    glBegin(GL_LINE_STRIP) ;
  233.    for (a=arr,i=0; i<256; a++,i++)
  234.      glVertex3fv(&a->x) ;
  235.    glVertex3fv(&arr->x) ;
  236.    glEnd() ;
  237.    glEndList() ;
  238.  
  239.    body->orbtobj[1] = glGenLists(1);
  240.    glNewList(body->orbtobj[1],GL_COMPILE) ;
  241.  
  242.    glBegin(GL_LINE_STRIP) ;
  243.    for (a=arr,i=0; i<256; a+=4,i+=4)
  244.      glVertex3fv(&a->x) ;
  245.    glVertex3fv(&arr->x) ;
  246.    glEnd() ;
  247.    glEndList() ;
  248.  
  249.    body->orbtobj[2] = glGenLists(1);
  250.    glNewList(body->orbtobj[2],GL_COMPILE) ;
  251.  
  252.    glBegin(GL_LINE_STRIP) ;
  253.    for (a=arr,i=0; i<256; a+=16,i+=16)
  254.      glVertex3fv(&a->x) ;
  255.    glVertex3fv(&arr->x) ;
  256.    glEnd() ;
  257.    glEndList() ;
  258. }
  259.  
  260. /**********************************************************************
  261. *  object_planet_rings()  - 
  262. ***********************************************************************/
  263. sint32 object_planet_rings(t_system *planet,sint32 reso) 
  264.  
  265. {  register sint32 i,obj ;
  266.    register flot32 theta,delta,s,c,w ;
  267.    register flot32 theta1,theta2,alpha ;
  268.    register P3     p,q,r ;
  269.    register T2     t1,t2 ;
  270.  
  271.    theta1 = fasin(planet->rad/planet->r1) ;
  272.    theta2 = fasin(planet->rad/planet->r2) ;
  273.  
  274.    alpha = fasin(planet->rad/planet->r2) ; 
  275.    delta = 2.0*M_PI/(flot32)reso ;  
  276.  
  277.    obj = glGenLists(1);
  278.    glNewList(obj,GL_COMPILE) ;
  279.  
  280.    /* lit part */
  281.    glColor4ub(0xff,0xff,0xff,0xa0) ;
  282.    glBegin(GL_TRIANGLE_STRIP) ;
  283.  
  284.    t2.s = 1.0 ;
  285.    t2.t = 1.0 ;
  286.  
  287.    for (theta=theta2; theta<2.0*M_PI-theta2+0.001; theta+=delta)  {
  288.      s = fsin(theta) ;
  289.      c = fcos(theta) ;
  290.  
  291.      q.x = planet->r2*s ;
  292.      q.y = 0.0;
  293.      q.z = planet->r2*c ;
  294.      glTexCoord2fv(&t2.s) ;
  295.      glVertex3fv(&q.x) ;
  296.  
  297.      if (theta < theta1)  {
  298.        w = planet->rad / sin(M_PI-alpha-(theta-theta2)) ;
  299.        t1.s = t1.t = (w-planet->r1)/(planet->r2-planet->r1) ;
  300.        }
  301.      else if (theta < 2.0*M_PI-theta1)  {
  302.        w = planet->r1 ;
  303.        t1.s = t1.t = 0.0 ;
  304.        }
  305.      else  {
  306.        w = planet->rad / sin(M_PI-alpha-((theta1-theta2) - (theta-2.0*M_PI+theta1))) ;
  307.        t1.s = t1.t = (w-planet->r1)/(planet->r2-planet->r1) ;
  308.        }
  309.  
  310.      q.x = w*s ;
  311.      q.y = 0.0;
  312.      q.z = w*c ;
  313.      glTexCoord2fv(&t1.s) ;
  314.      glVertex3fv(&q.x) ;
  315.      }
  316.  
  317.    q.x = planet->r2*fsin(-theta2) ;
  318.    q.y = 0.0;
  319.    q.z = planet->r2*fcos(-theta2) ;
  320.    glTexCoord2fv(&t2.s) ;
  321.    glVertex3fv(&q.x) ;
  322.  
  323.    glEnd() ;
  324.  
  325.    /* shadow part */
  326.    glColor4ub(0xff,0xff,0xff,0x10) ;
  327.    glBegin(GL_TRIANGLE_STRIP) ;
  328.  
  329.    t1.s = 0.0 ;
  330.    t1.t = 0.0 ;
  331.  
  332.    for (theta= -theta1; theta<theta1+0.001; theta+=delta)  {
  333.      s = fsin(theta) ;
  334.      c = fcos(theta) ;
  335.  
  336.      q.x = planet->r1*s ;
  337.      q.y = 0.0;
  338.      q.z = planet->r1*c ;
  339.      glTexCoord2fv(&t1.s) ;
  340.      glVertex3fv(&q.x) ;
  341.  
  342.      if (theta < -theta2)  {
  343.        w = planet->rad / sin(M_PI-alpha+theta2+theta) ;
  344.        t2.s = t2.t = (w-planet->r1)/(planet->r2-planet->r1) ;
  345.        }
  346.      else if (theta < theta2)  {
  347.        w = planet->r2 ;
  348.        t2.s = t2.t = 1.0 ;
  349.        }
  350.      else  {
  351.        w = planet->rad / sin(M_PI-alpha-(theta-theta2)) ;
  352.        t2.s = t2.t = (w-planet->r1)/(planet->r2-planet->r1) ;
  353.        }
  354.  
  355.      q.x = w*s ;
  356.      q.y = 0.0;
  357.      q.z = w*c ;
  358.      glTexCoord2fv(&t2.s) ;
  359.      glVertex3fv(&q.x) ;
  360.      }
  361.  
  362.    q.x = planet->r1*fsin(theta1) ;
  363.    q.y = 0.0;
  364.    q.z = planet->r1*fcos(theta1) ;
  365.    glTexCoord2fv(&t1.s) ;
  366.    glVertex3fv(&q.x) ;
  367.  
  368.    glEnd() ;
  369.  
  370.    glEndList() ;
  371.    return(obj) ;
  372. }
  373.  
  374. /**********************************************************************
  375. *  object_shadow_squares()  -
  376. **********************************************************************/
  377. sint32 object_shadow_squares(void)
  378.  
  379. {  register sint32 i,obj ;
  380.    register flot32 v[3],h;
  381.  
  382.    h = M_PI/75.0;
  383.  
  384.    obj = glGenLists(1);
  385.    glNewList(obj,GL_COMPILE) ;
  386.  
  387.    glBegin(GL_QUADS);
  388.    for (i=0; i<360; i+=24)  {
  389.      v[0] = fcos((i+ 0)*DTOR); v[1] = -h; v[2] = fsin((i+ 0)*DTOR); glVertex3fv(v);
  390.      v[1] =  h; glVertex3fv(v);
  391.      v[0] = fcos((i+12)*DTOR); v[1] =  h; v[2] = fsin((i+12)*DTOR); glVertex3fv(v);
  392.      v[1] = -h; glVertex3fv(v);
  393.      }
  394.    glEnd();
  395.  
  396.    glEndList() ;
  397.    return(obj) ;
  398. }
  399.  
  400.